<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

<!-- Begin Jekyll SEO tag v2.8.0 -->
<title>使用 WSL 2 进行工作 | blog</title>
<meta name="generator" content="Jekyll v3.9.2" />
<meta property="og:title" content="使用 WSL 2 进行工作" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="WSL 2 使用过程中的一些注意事项." />
<meta property="og:description" content="WSL 2 使用过程中的一些注意事项." />
<link rel="canonical" href="https://tsagaanbar.gitee.io/blog/win/working-with-wsl-2/" />
<meta property="og:url" content="https://tsagaanbar.gitee.io/blog/win/working-with-wsl-2/" />
<meta property="og:site_name" content="blog" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2022-05-18T17:26:28+00:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="使用 WSL 2 进行工作" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2022-05-18T17:26:28+00:00","datePublished":"2022-05-18T17:26:28+00:00","description":"WSL 2 使用过程中的一些注意事项.","headline":"使用 WSL 2 进行工作","mainEntityOfPage":{"@type":"WebPage","@id":"https://tsagaanbar.gitee.io/blog/win/working-with-wsl-2/"},"url":"https://tsagaanbar.gitee.io/blog/win/working-with-wsl-2/"}</script>
<!-- End Jekyll SEO tag -->

    <link rel="stylesheet" href="/blog/assets/css/style.css?v=5a3a055c96aa4035d7a987d1ed733ff6fc09a8b3">
    <!-- start custom head snippets, customize with your own _includes/head-custom.html file -->

<!-- Setup Google Analytics -->



<!-- You can set your favicon here -->
<!-- link rel="shortcut icon" type="image/x-icon" href="/blog/favicon.ico" -->

<!-- end custom head snippets -->

  </head>
  <body>
    <div class="container-lg px-3 my-5 markdown-body">
      
      <p><a href="https://tsagaanbar.gitee.io/blog/">tsagaanbar's Blog</a></p>
      <h1>使用 WSL 2 进行工作</h1>

      <h2 id="了解-wsl-2">了解 WSL 2</h2>

<p>可以查看微软文档上的 <a href="https://docs.microsoft.com/zh-cn/windows/wsl/">适用于 Linux 的 Windows 子系统文档 - Microsoft Docs</a>, 接下来也会引用其中的一些页面.</p>

<p>微软文档可以切换语言, 如有需要点击页面上的 <kbd>🌐</kbd> 语言切换图标即可.</p>

<p>为什么使用 WSL? : <a href="https://www.zhihu.com/question/393170756">为什么这么多人吹 WSL? - 知乎</a></p>

<h2 id="安装-installation">安装 Installation</h2>

<p>首先是安装 WSL 2, 参考微软文档 <a href="https://docs.microsoft.com/zh-cn/windows/wsl/install">使用 WSL 在 Windows 上安装 Linux</a> 即可.</p>

<p>安装完成后是 <a href="https://docs.microsoft.com/zh-cn/windows/wsl/setup/environment">设置 WSL 开发环境</a>, 可以根据自己的需要参考文档中的相关部分进行设置.</p>

<h2 id="networking">Networking</h2>

<p>最主要的是网络问题. 一般日常工作需要, 需要 WSL2 和主机能够互相访问.</p>

<p>WSL 2 作为 Hyper-V 虚拟机运行, 不同于 WSL 1 的桥接, 其使用网络地址转换 (NAT) 服务作为其虚拟网络 <sup id="fnref:compare-versions" role="doc-noteref"><a href="#fn:compare-versions" class="footnote" rel="footnote">1</a></sup>. 因此, 主机和 WSL 2 需要首先得知对方在该虚拟网络下的 IP 地址才能互相通信. 需要注意, 每次重启主机, 该 IP 地址都会发生变化.</p>

<p>可以通过下面的方法获取主机和 WSL 2 的 IP <sup id="fnref:get-ip" role="doc-noteref"><a href="#fn:get-ip" class="footnote" rel="footnote">2</a></sup>:</p>

<p>在运行的 WSL 2 上, 可以通过访问  <code class="language-plaintext highlighter-rouge">/etc/resolv.conf</code>, 从而得知主机在该网络下的地址:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.21.160.1
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }
172.21.160.1
</code></pre></div></div>

<p>可以通过 <code class="language-plaintext highlighter-rouge">hostname -I</code> 得到 WSL 2 的 IP.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ hostname -I | awk '{print $1}'
172.21.172.66 
</code></pre></div></div>

<p>但是, 要想 WSL 2 成功访问主机, 还需要主机放开防火墙规则. 可以参考下面的 PowerShell 命令 (需要管理员权限) <sup id="fnref:disable-win-firewall" role="doc-noteref"><a href="#fn:disable-win-firewall" class="footnote" rel="footnote">3</a></sup>, 解除 Windows 主机上针对 WSL 虚拟网卡的防火墙规则:</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 直接放开 `vEthernet (WSL)` 这张网卡的防火墙</span><span class="w">
</span><span class="n">New-NetFirewallRule</span><span class="w"> </span><span class="nt">-DisplayName</span><span class="w"> </span><span class="s2">"WSL"</span><span class="w"> </span><span class="nt">-Direction</span><span class="w"> </span><span class="nx">Inbound</span><span class="w"> </span><span class="nt">-InterfaceAlias</span><span class="w"> </span><span class="s2">"vEthernet (WSL)"</span><span class="w"> </span><span class="nt">-Action</span><span class="w"> </span><span class="nx">Allow</span><span class="w">
</span></code></pre></div></div>

<h3 id="proxy">Proxy</h3>

<p>从前文可以看出, WSL 2 的网络配置略显复杂, 因此先考虑在 WSL2 上直接运行代理程序 (Clash), 未果, 不能与网络代理服务提供商的服务器正常通信 (猜测可能是时区问题).</p>

<p>折腾许久不得, 于是作罢, 还是尝试使用主机上运行的代理程序.</p>

<p>WSL 2 对主机上程序的访问, 相当于来自局域网的访问. 因此, 需要打开代理软件 “<strong>允许来自局域网的连接</strong> (Allow LAN)” 的设置. 同时, 除了前文说到的 <strong>放行 WSL 2 的网卡</strong> 外, 还需要 <strong>允许代理软件通过防火墙</strong> <sup id="fnref:pass-firewall" role="doc-noteref"><a href="#fn:pass-firewall" class="footnote" rel="footnote">4</a></sup> (可能会在第一次开启代理软件的 “Allow LAN” 的时候弹出提醒).</p>

<p>之后, 便可以在 WSL 2 上使用主机上的代理了.</p>

<p>备注: 尚未研究 SSH 的代理. 可以参考:</p>

<p><a href="https://github.com/wizcas/wsl2proxy">wizcas/wsl2proxy - github.com</a></p>

<h3 id="端口转发">端口转发</h3>

<p>从局域网访问主机上的 WSL 2, 可以参考; 因本人暂无需求, 故尚未研究. 下面仅备注一些可能相关的链接.</p>

<p><a href="https://zhuanlan.zhihu.com/p/425312804">如何在局域网的其他主机上中访问本机的 WSL2 - 知乎</a></p>

<p><a href="https://ruihusky.github.io/ruihusky/posts/2020-12-11_wsl2-net-config/">Windows 10 WSL 2 网络配置 | ruihusky’s Blog</a></p>

<h2 id="file-system">File System</h2>

<p>虽然 Windows 的文件系统挂载在了 WSL 2 上, Windows 中也可以直接在资源管理器中访问 WSL 2 上的文件系统. 但是建议, 在可能的情况下, 还是将文件放在 WSL 2 中处理, 尽量不要跨系统进行操作.</p>

<h2 id="misc">Misc</h2>

<ul>
  <li><a href="https://xiabee.cn/coding/wsl2/">WSL 2 踩坑分享 - xiabee</a></li>
  <li><a href="https://superuser.com/questions/1606213/how-do-i-get-back-unused-disk-space-from-ubuntu-on-wsl2/1612289#1612289">How do I get back unused disk space from ubuntu on wsl2? - Super User</a></li>
  <li><a href="https://docs.microsoft.com/en-us/windows/wsl/wsl2-mount-disk">Get started mounting a Linux disk in WSL 2 | Microsoft Docs</a></li>
  <li><a href="https://docs.microsoft.com/en-us/windows/wsl/connect-usb">Connect USB devices | Microsoft Docs</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:compare-versions" role="doc-endnote">
      <p><a href="https://docs.microsoft.com/zh-cn/windows/wsl/compare-versions">比较 WSL 1 和 WSL 2 - Microsoft Docs</a> <a href="#fnref:compare-versions" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:get-ip" role="doc-endnote">
      <p><a href="https://zinglix.xyz/2020/04/18/wsl2-proxy/#wsl-中获取宿主机-ip">#WSL 中获取宿主机 IP - WSL 2 中访问宿主机 Windows 的代理 - ZingLix Blog</a> <a href="#fnref:get-ip" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:disable-win-firewall" role="doc-endnote">
      <p>来自 <a href="https://bytem.io/posts/wsl2-network-tricks/">WSL 2 的一些网络访问问题 | Artin’s Blog (bytem.io)</a>, 引用自 <a href="https://github.com/microsoft/WSL/issues/4585">Issue #4585 · microsoft/WSL</a>. 前者还提到了使用 TUN 模式代理整张网卡的流量. <a href="#fnref:disable-win-firewall" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:pass-firewall" role="doc-endnote">
      <p><a href="https://zhuanlan.zhihu.com/p/144583887">WSL 2 来了! 但是能正常使用并不简单 - Wizcas - 知乎</a> (Also available at <a href="https://0x1c.dev/blog/dev/make-wsl2-right/">0x1C.dev</a>); 该文章参考了 <a href="https://blog.rogerkung-win.top/posts/38819/">在 WSL 2 中访问主机代理 - Geek 成长路 (rogerkung-win.top)</a>. <a href="#fnref:pass-firewall" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>


      
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.0/anchor.min.js" integrity="sha256-lZaRhKri35AyJSypXXs4o6OPFTbTmUoltBbDCbdzegg=" crossorigin="anonymous"></script>
    <script>anchors.add();</script>
  </body>
</html>
